#include "clock_timer.h"

int clock_timer() {
    //! 1. 记录时长的duration
    /**
     * @brief duration的格式
     * 
     *       template<typename _Rep, typename _Period>
     *       struct duration
     * 
     *   _Rep     表示数值类型   int, float, double
     *   _Period  表示周期, 其类型为std::chrono:ratio,  表示每个时钟周期的秒数
     * 
     *        template<intmax_t _Num, intmax_t _Den = 1>
     *        struct ratio
     * 
     *    ratio<2>        代表一个时钟周期是两秒
     *    ratio<60>       代表一个时钟周期是一分钟
     *    ratio<3600>     代表一个时钟周期是一个小时
     *    ratio<3600*24>  代表一个时钟周期是一天
     *    ratio<1, 1000>  代表一个时钟周期是一毫秒
     *    ratio<1, 1e6>   代表一个时钟周期是一微秒
     */

    // 系统内置了一些时间
    // typedef std::chrono::duration<int, std::chrono::ratio<1, 1000>> millonseconds;
    std::chrono::milliseconds ms{3};   // 3ms
 
    std::chrono::microseconds us = 2 * ms;            // 6000us
    std::cout << ms.count() << ", " << us.count() << std::endl;

    //! 2. 时间运算
    std::chrono::minutes t1(10);
    std::chrono::seconds t2(60);

    //! duration加减运算规则: 运算双方时钟周期不同时, 对于ratio<x1,y2>与ratio<x2, y2>
    // 计算结果为ratio<x, y>, 其中x为x1,x2的最大公约数, y为y1, y2的最小公倍数
    std::chrono::seconds t3 = t1 - t2;
    std::cout << t3.count()  << std::endl;


    //! 3. 系统时间点
    using day_type = std::chrono::duration<int, std::ratio<3600*24>>;
    auto today = std::chrono::time_point_cast<day_type>(std::chrono::system_clock::now());
    std::cout << today.time_since_epoch().count() << std::endl;

    auto now = std::chrono::system_clock::now();
    std::time_t last = std::chrono::system_clock::to_time_t(now - std::chrono::hours(24));
    std::time_t next = std::chrono::system_clock::to_time_t(now + std::chrono::hours(24));


    //! timer 计时器
	Timer t; //开始计时
	fun();

	std::cout << t.elapsed_seconds() << std::endl; //打印fun函数耗时多少秒
	std::cout << t.elapsed_nano()    << std::endl; //打印纳秒
	std::cout << t.elapsed_micro()   << std::endl; //打印微秒
	std::cout << t.elapsed()         << std::endl; //打印毫秒
	std::cout << t.elapsed_seconds() << std::endl; //打印秒
	std::cout << t.elapsed_minutes() << std::endl; //打印分钟
	std::cout << t.elapsed_hours()   << std::endl; //打印小时

    return 0;
}